<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="utf-8">
  

  
  <title>gdb-基本用法 | 章军的博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="gdb 调试的必要设置">
<meta name="keywords" content="gdb debug,cgdb">
<meta property="og:type" content="article">
<meta property="og:title" content="gdb-基本用法">
<meta property="og:url" content="http://octopuscloud.top/2019/05/24/gdb-基本用法/index.html">
<meta property="og:site_name" content="章军的博客">
<meta property="og:description" content="gdb 调试的必要设置">
<meta property="og:locale" content="China">
<meta property="og:updated_time" content="2019-09-11T04:27:11.136Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="gdb-基本用法">
<meta name="twitter:description" content="gdb 调试的必要设置">
  
    <link rel="alternate" href="/atom.xml" title="章军的博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link rel="stylesheet" href="/css/style.css">
</head>
</html>
<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">章军的博客</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://octopuscloud.top"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-gdb-基本用法" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2019/05/24/gdb-基本用法/" class="article-date">
  <time datetime="2019-05-24T01:57:23.000Z" itemprop="datePublished">2019-05-24</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/linux/">linux</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      gdb-基本用法
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="gdb-调试的必要设置"><a href="#gdb-调试的必要设置" class="headerlink" title="gdb 调试的必要设置"></a>gdb 调试的必要设置</h2><a id="more"></a>
<pre><code>1. 在编译是需要加上 -g 选项
2. 如果希望在程序在运行出错时会产生 core 文件 ，需要用 ulimit -c &lt;number&gt; 来设置 core 文件的大小 ，或者使用 ulimit -c unlimited 
   命令使系统不在限制 core 文件的大小 。
</code></pre><h2 id="cgdb-的安装"><a href="#cgdb-的安装" class="headerlink" title="cgdb 的安装"></a>cgdb 的安装</h2><pre><code>cgdb 是 gdb 的升级版本 ，提供一个 gdb 的终端界面的版本 ，在 cgdb 的界面调试下更加直观 。
安装请参考 [官网][1] 或 [github仓库][2]
</code></pre><h3 id="cgdb-的操作"><a href="#cgdb-的操作" class="headerlink" title="cgdb 的操作"></a>cgdb 的操作</h3><pre><code>1. 导入调试文件 。
$ cgdb ./yourBinFime

2. 启动调试 run/r
(gdb) run 

3. 加断点
  cgdb 下可以使用两种方式来加断点 ，按下 ESC ，cgdb 进入上方的源码框中 ，此时在需要加断点的
位置按下 space ，如果需要取消断点 ，在按下便是取消断点 。也可以用 b/break &lt;line&gt; 来加断点 。

4. 查看信息
  当程序在某一处因为断点或者程序错误停止时 ，我们可能需要查看某一些信息 

  4.1 查看当前程序的栈信息, bt/backtrace

  $ bt
  (gdb) bt
  #0  RBTreeInsert (root=0x7fffffffdaf0, new=0x55555555a6b0) at src/RBTree.c:463
  #1  0x00005555555552ae in main (argc=1, argv=0x7fffffffdcb8 &quot;s\340\377\377\377\177&quot;) at src/main.c:24

  4.2  查看程序 frame
  $ info frame 
  (gdb) info f
    Stack level 0, frame at 0x7fffffffdad0:
     rip = 0x555555555b8d in RBTreeInsert (src/RBTree.c:463);
        saved rip = 0x5555555552ae
     called by frame at 0x7fffffffdbe0
     source language c.
     Arglist at 0x7fffffffdac0, args: root=0x7fffffffdaf0, new=0x55555555a6b0
     Locals at 0x7fffffffdac0, Previous frame&apos;s sp is 0x7fffffffdad0
     Saved registers:
      rbp at 0x7fffffffdac0, rip at 0x7fffffffdac8

    4.3 info args
      打印出当前函数的参数名及其值。

    4.4 info locals
      打印出当前函数中所有局部变量及其值。

    4.5 info catch
      打印出当前的函数中的异常处理信息。

5. 查看程序中的变量
  在GDB中，你可以随时查看以下三种变量的值：
  1、全局变量（所有文件可见的）
  2、静态全局变量（当前文件可见的）
  3、局部变量（当前Scope可见的）

  如果你的局部变量和全局变量发生冲突（也就是重名），一般情况下是局部变量会隐
  藏全局变量，也就是说，如果一个全局变量和一个函数中的局部变量同名时，如果当
  前停止点在函数中，用print显示出的变量的值会是函数中的局部变量的值。如果
  此时你想查看全局变量的值时，你可以使用“::”操作符：
  $ p file::variable
  $ function::variable

6. 查看数组

  有时候，你需要查看一段连续的内存空间的值。比如数组的一段，或是动态分配的
  数据的大小。你可以使用GDB的“@”操作符，“@”的左边是第一个内存的地址的
  值，“@”的右边则你你想查看内存的长度。例如，你的程序中有这样的语句：
  int *array = (int *) malloc (len * sizeof (int));
  于是，在GDB调试过程中，你可以以如下命令显示出这个动态数组的取值：
  p *array@len
  @的左边是数组的首地址的值，也就是变量array所指向的内容，右边则是数据的长度，其保存在变量len中，其输出结果，大约是下面这个样子的：
  (gdb) p *array@len
  $1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32,34, 36, 38, 40}
  如果是静态数组的话，可以直接用print数组名，就可以显示数组中所有数据的内容了。

  一般来说，GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格
  式。例如，你想输出一个整数的十六进制，或是二进制来查看这个整型变量的中的
  位的情况。要做到这样，你可以使用GDB的数据显示格式：
  x - 十六进制 d - 十进制 u - 无符号 o - 八进制 t - 二进制 c - 字符 f - 浮点数
  (gdb) p/a i
  $22 = 0x65

7. 查看内存

  你可以使用examine命令（简写是x）来查看内存地址中的值。x命令的语法如下所示：
  x/
  n、f、u是可选的参数。
  n 是一个正整数，表示显示内存的长度，也就是说从当前地址向后显示几个地址的内容。
  f 表示显示的格式，参见上面。如果地址所指的是字符串，那么格式可以是s，如果地十是指令地址，那么格式可以是i。
  u 表示从当前地址往后请求的字节数，如果不指定的话，GDB默认是4个bytes。

  n/f/u三个参数可以一起使用。例如：
  $ x/3uh 0x54320  //从内存地址0x54320读取内容，h表示以双字节为一个单位，3表示三个单位，u表示按十六进制显示。

8. 自动显示

  你可以设置一些自动显示的变量，当程序停住时，或是在你单步跟踪时，这些变量会自动显示。相关的GDB命令是display。
  display
  display/
  display/
  expr是一个表达式，fmt表示显示的格式，addr表示内存地址，当你用display设定好了一个或多个表达式后，只要你的程序被停下来，GDB会自动显示你所设置的这些表达式的值。
  格式i和s同样被display支持，一个非常有用的命令是：
  display/i $pc
  $pc是GDB的环境变量，表示着指令的地址，/i则表示输出格式为机器指令码，也就是汇编。于是当程序停下后，就会出现源代码和机器指令码相对应的情形，这是一个很有意思的功能。
  下面是一些和display相关的GDB命令：
  undisplay
  delete display
  删除自动显示，dnums意为所设置好了的自动显式的编号。如果要同时删除几个，编号可以用空格分隔，如果要删除一个范围内的编号，可以用减号表示（如：2-5）
  disable display
  enable display
  disable和enalbe不删除自动显示的设置，而只是让其失效和恢复。
  info display
  查看display设置的自动显示的信息。GDB会打出一张表格，向你报告当然调试中设置了多少个自动显示设置，其中包括，设置的编号，表达式，是否enable。

9. 结构体显示的设置

  $ set print pretty on/off
</code></pre><h2 id="在调试时修改程序"><a href="#在调试时修改程序" class="headerlink" title="在调试时修改程序"></a>在调试时修改程序</h2><pre><code>1. 修改变量值
  (gdb) set var width=47
  另外，还可能有些情况，GDB并不报告这种错误，所以保险起见，在你改变程序变量取值时，最好都使用setvar格式的GDB命令。

2. 跳转执行
一般来说，被调试程序会按照程序代码的运行顺序依次执行。GDB提供了乱序执行的功能，也就是说，GDB可以修改程序的执行顺序，可以让程序执行随意跳跃。这个功能可以由GDB的jump命令来完：
$ jump &lt;file:line|+num&gt;

注意，jump命令不会改变当前的程序栈中的内容，所以，当你从一个函数跳到另一个
函数时，当函数运行完返回时进行弹栈操作时必然会发生错误，可能结果还是非常
奇怪的，甚至于产生程序Core Dump。所以最好是同一个函数中进行跳转。
熟悉汇编的人都知道，程序运行时，有一个寄存器用于保存当前代码所在的内存地
址。所以，jump命令也就是改变了这个寄存器中的值。于是，你可以使用“set
$pc”来更改跳转执行的地址。如：
set $pc = 0x485

3. 产生信号量
使用singal命令，可以产生一个信号量给被调试的程序。如：中断信号Ctrl+C。这
非常方便于程序的调试，可以在程序运行的任意位置设置断点，并在该断点用GDB产
生一个信号量，这种精确地在某处产生信号非常有利程序的调试。
语法是：signal ，UNIX的系统信号量通常从1到15。所以取值也在这个范围。
single命令和shell的kill命令不同，系统的kill命令发信号给被调试程序时，是由
GDB截获的，而single命令所发出一信号则是直接发给被调试程序的。

4. 强制函数返回
$ return 
如果你的调试断点在某个函数中，并还有语句没有执行完。你可以使用return命令强制函数忽略还没有执行的语句并返回。
使用return命令取消当前函数的执行，并立即返回，如果指定了，那么该表达式的值会被认作函数的返回值。

5. 强制调用函数
$ call &lt;function&gt;
表达式中可以一是函数，以此达到强制调用函数的目的。并显示函数的返回值，如
果函数返回值是void，那么就不显示。
另一个相似的命令也可以完成这一功能——print，print后面可以跟表达式，所以也
可以用他来调用函数，print和call的不同是，如果函数返回void，call则不显
示，print则显示函数返回值，并把该值存入历史数据中。
</code></pre><p>参考: <a href="https://www.cnblogs.com/lynsen/p/8439550.html" target="_blank" rel="noopener">https://www.cnblogs.com/lynsen/p/8439550.html</a></p>
<hr>
<p>1: <a href="http://cgdb.github.io/" target="_blank" rel="noopener">http://cgdb.github.io/</a><br>2: <a href="https://github.com/cgdb/cgdb" target="_blank" rel="noopener">https://github.com/cgdb/cgdb</a></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://octopuscloud.top/2019/05/24/gdb-基本用法/" data-id="ck471vq10001332fzsuds2tip" class="article-share-link">Share</a>
      
      
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/cgdb/">cgdb</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/gdb-debug/">gdb debug</a></li></ul>

    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2019/06/02/十三章-红黑树/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          第十三章-红黑树
        
      </div>
    </a>
  
  
    <a href="/2019/04/28/十一章-散列表/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">第十一章-散列表</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Categories</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/RFC/">RFC</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/RFC-protocol/">RFC protocol</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/ReadNote/">ReadNote</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/linux/">linux</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/protocols/">protocols</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/tools/">tools</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/C/">C</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Data-Struct/">Data Struct</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Ethernet-II/">Ethernet II</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Frame-Format/">Frame Format</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/I2C/">I2C</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/IPv6/">IPv6</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Neighbour-Discover-Protocol/">Neighbour Discover Protocol</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/RFC/">RFC</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/SNMP/">SNMP</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/arthmetic/">arthmetic</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/cgdb/">cgdb</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/chapter-15/">chapter 15</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/data-struct/">data struct</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/deb/">deb</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/defalt-path-for-so-file/">defalt path for so file</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/editer/">editer</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/file-system/">file system</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/gdb-debug/">gdb debug</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/hash/">hash</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/linux/">linux</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/linux-driver/">linux driver</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/platform-bus/">platform bus</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/pointer-array/">pointer, array</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/pseudocode/">pseudocode</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/rb-tree/">rb tree</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/sort/">sort</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/ssh-key/">ssh key</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/symbol/">symbol</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/tool/">tool</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/tools/">tools</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/图/">图</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/通信协议/">通信协议</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tag Cloud</h3>
    <div class="widget tagcloud">
      <a href="/tags/C/" style="font-size: 10px;">C</a> <a href="/tags/Data-Struct/" style="font-size: 10px;">Data Struct</a> <a href="/tags/Ethernet-II/" style="font-size: 10px;">Ethernet II</a> <a href="/tags/Frame-Format/" style="font-size: 10px;">Frame Format</a> <a href="/tags/I2C/" style="font-size: 10px;">I2C</a> <a href="/tags/IPv6/" style="font-size: 15px;">IPv6</a> <a href="/tags/Neighbour-Discover-Protocol/" style="font-size: 10px;">Neighbour Discover Protocol</a> <a href="/tags/RFC/" style="font-size: 10px;">RFC</a> <a href="/tags/SNMP/" style="font-size: 10px;">SNMP</a> <a href="/tags/arthmetic/" style="font-size: 10px;">arthmetic</a> <a href="/tags/cgdb/" style="font-size: 10px;">cgdb</a> <a href="/tags/chapter-15/" style="font-size: 10px;">chapter 15</a> <a href="/tags/data-struct/" style="font-size: 15px;">data struct</a> <a href="/tags/deb/" style="font-size: 10px;">deb</a> <a href="/tags/defalt-path-for-so-file/" style="font-size: 10px;">defalt path for so file</a> <a href="/tags/editer/" style="font-size: 10px;">editer</a> <a href="/tags/file-system/" style="font-size: 10px;">file system</a> <a href="/tags/gdb-debug/" style="font-size: 10px;">gdb debug</a> <a href="/tags/hash/" style="font-size: 10px;">hash</a> <a href="/tags/linux/" style="font-size: 20px;">linux</a> <a href="/tags/linux-driver/" style="font-size: 10px;">linux driver</a> <a href="/tags/platform-bus/" style="font-size: 10px;">platform bus</a> <a href="/tags/pointer-array/" style="font-size: 10px;">pointer, array</a> <a href="/tags/pseudocode/" style="font-size: 10px;">pseudocode</a> <a href="/tags/rb-tree/" style="font-size: 10px;">rb tree</a> <a href="/tags/sort/" style="font-size: 20px;">sort</a> <a href="/tags/ssh-key/" style="font-size: 10px;">ssh key</a> <a href="/tags/symbol/" style="font-size: 10px;">symbol</a> <a href="/tags/tool/" style="font-size: 10px;">tool</a> <a href="/tags/tools/" style="font-size: 10px;">tools</a> <a href="/tags/图/" style="font-size: 10px;">图</a> <a href="/tags/通信协议/" style="font-size: 10px;">通信协议</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/12/">December 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/11/">November 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/10/">October 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/09/">September 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/08/">August 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/07/">July 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/06/">June 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/05/">May 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/04/">April 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/03/">March 2019</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2019/12/15/TMUX-使用/">TMUX-使用</a>
          </li>
        
          <li>
            <a href="/2019/11/02/linux-platform-bus-总线分析/platform/">(no title)</a>
          </li>
        
          <li>
            <a href="/2019/11/02/十二章-二叉搜索树/">算法导论-第十二章 二叉查找树</a>
          </li>
        
          <li>
            <a href="/2019/11/02/SegmentationFault-Debug/">(no title)</a>
          </li>
        
          <li>
            <a href="/2019/10/19/linux-platform-bus-总线分析/">linux platform bus 总线分析</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2019 zhangjun<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/script.js"></script>



  </div>
</body>
</html>